/*
 * CommunicationAGV.cpp
 *
 *  Created on: 04/11/2013
 *      Author: gonzalo
 */

#include "CommunicationAGV.h"
#include "../capa_servicios_distribuidos/QueueLauncher.h"
#include "../channel_common/agent_address_service/AgentAddressService.h"

namespace middleware {

const Uid CommunicationAGV::UID = "agvRecepcion";

CommunicationAGV::CommunicationAGV(char key,std::string hostName):
			colaPedidos(ipc::MessageQueue<PedidoPiezas>::get(IPCUids::getFile(UID)+hostName, key))
{
	mtypeReqAGV = channel::AgentAddressService::resolve(UID+key);
}

void CommunicationAGV::create(char key,AGVCommunicationType type,std::string hostName) {

	int mtypeReqAGV = 0;
	// solo registrar para el receptor
	if (type == AGV) {
		mtypeReqAGV = channel::AgentAddressService::registerName(UID+key);
	}

	servicios_distribuidos::QueueLauncher::createDistributedQueue
	<PedidoPiezas>
	(IPCUids::getFile(UID)+hostName, key, hostName,(type==AGV)?
	servicios_distribuidos::QUEUE_RECV : servicios_distribuidos::QUEUE_SEND,mtypeReqAGV);
}

void CommunicationAGV::destroy(char key,std::string hostName) {
	ipc::MessageQueue<PedidoPiezas>::destroy(IPCUids::getFile(UID)+hostName, key);
}

void CommunicationAGV::agregarPedidoCanastos(PedidoPiezas piezas) {
	CLogger::log("Escribo pedidos para agv con mtype " + StringUtils::itos(mtypeReqAGV));
	colaPedidos.put(mtypeReqAGV, piezas);
}

std::vector<TipoPieza> CommunicationAGV::obtenerPedidoDePiezas() {
	CLogger::log("Esperando en cola pedidos con mtype " + StringUtils::itos(mtypeReqAGV));
	PedidoPiezas piezasRequeridas = colaPedidos.get(mtypeReqAGV);
	std::vector<TipoPieza> resultado;
	std::stringstream ss;
	ss << "[ ";
	for (int i=0; i< MAX_PIEZAS; i++) {
		if(piezasRequeridas.piezas[i] > 0){
			ss << piezasRequeridas.piezas[i] << " ";
			resultado.push_back(piezasRequeridas.piezas[i]);
		}
	}
	ss << " ]";
	CLogger::log("Pedido de piezas:" + ss.str());

	return resultado;
}

void CommunicationAGV::colocarCanastosEnPosicion(Canasto c[MAX_PIEZAS], int pos) {

}

CommunicationAGV::~CommunicationAGV() {
}

} /* namespace middleware */
